<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Struct template when&lt;Grammar, proto::external_transform&gt;</title>
<link rel="stylesheet" href="../../../../doc/src/boostbook.css" type="text/css">
<meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
<link rel="home" href="../../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
<link rel="up" href="../../proto/reference.html#header.boost.proto.transform.when_hpp" title="Header &lt;boost/proto/transform/when.hpp&gt;">
<link rel="prev" href="when_Gra_1_3_34_5_52_2_1_6/impl.html" title="Struct template impl">
<link rel="next" href="when_Gra_1_3_34_5_52_2_1_7/impl.html" title="Struct template impl">
</head>
<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
<table cellpadding="2" width="100%"><tr>
<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../boost.png"></td>
<td align="center"><a href="../../../../index.html">Home</a></td>
<td align="center"><a href="../../../../libs/libraries.htm">Libraries</a></td>
<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
<td align="center"><a href="../../../../more/index.htm">More</a></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="when_Gra_1_3_34_5_52_2_1_6/impl.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../proto/reference.html#header.boost.proto.transform.when_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="when_Gra_1_3_34_5_52_2_1_7/impl.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
</div>
<div class="refentry">
<a name="boost.proto.when_Gra_1_3_34_5_52_2_1_7"></a><div class="titlepage"></div>
<div class="refnamediv">
<h2><span class="refentrytitle">Struct template when&lt;Grammar, proto::external_transform&gt;</span></h2>
<p>boost::proto::when&lt;Grammar, &gt; — A grammar element that associates an externally-specified transform with the grammar.
          The transform is looked up in the Data parameter using the Grammar as a key.</p>
</div>
<h2 xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv-title">Synopsis</h2>
<div xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="refsynopsisdiv"><pre class="synopsis"><span class="comment">// In header: &lt;<a class="link" href="../../proto/reference.html#header.boost.proto.transform.when_hpp" title="Header &lt;boost/proto/transform/when.hpp&gt;">boost/proto/transform/when.hpp</a>&gt;

</span><span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> Grammar<span class="special">&gt;</span> 
<span class="keyword">struct</span> <a class="link" href="when_Gra_1_3_34_5_52_2_1_7.html" title="Struct template when&lt;Grammar, proto::external_transform&gt;">when</a><span class="special">&lt;</span><span class="identifier">Grammar</span><span class="special">,</span> <a class="link" href="external_transform.html" title="Struct external_transform">proto::external_transform</a><span class="special">&gt;</span> <span class="special">:</span>
  <span class="keyword"></span> 
  <a class="link" href="transform.html" title="Struct template transform">proto::transform</a>&lt; when&lt;Grammar, <a class="link" href="external_transform.html" title="Struct external_transform">proto::external_transform</a>&gt; &gt;
<span class="special">{</span>
  <span class="comment">// types</span>
  <span class="keyword">typedef</span> <span class="keyword">typename</span> <span class="identifier">Grammar</span><span class="special">::</span><span class="identifier">proto_grammar</span> <a name="boost.proto.when_Gra_1_3_34_5_52_2_1_7.proto_grammar"></a><span class="identifier">proto_grammar</span><span class="special">;</span>

  <span class="comment">// member classes/structs/unions</span>
  <span class="keyword">template</span><span class="special">&lt;</span><span class="keyword">typename</span> <a class="link" href="../../Expr.html" title="Concept Expr">Expr</a><span class="special">,</span> <span class="keyword">typename</span> State<span class="special">,</span> <span class="keyword">typename</span> Data<span class="special">&gt;</span> 
  <span class="keyword">struct</span> <a class="link" href="when_Gra_1_3_34_5_52_2_1_7/impl.html" title="Struct template impl">impl</a> <span class="special">:</span> <span class="keyword"></span> 
    <span class="identifier">boost</span><span class="special">::</span><span class="identifier">remove_reference</span><span class="special">&lt;</span> 
      <span class="keyword">typename</span> <span class="identifier">mpl</span><span class="special">::</span><span class="identifier">eval_if_c</span><span class="special">&lt;</span>
        <a class="link" href="result_of/has_env_var.html" title="Struct template has_env_var">proto::result_of::has_env_var</a><span class="special">&lt;</span><span class="identifier">Data</span><span class="special">,</span> <a class="link" href="transforms_type.html" title="Struct transforms_type">proto::transforms_type</a><span class="special">&gt;</span><span class="special">::</span><span class="identifier">value</span><span class="special">,</span>
        <a class="link" href="result_of/env_var.html" title="Struct template env_var">proto::result_of::env_var</a><span class="special">&lt;</span><span class="identifier">Data</span><span class="special">,</span> <a class="link" href="transforms_type.html" title="Struct transforms_type">proto::transforms_type</a><span class="special">&gt;</span><span class="special">,</span>
        <a class="link" href="result_of/env_var.html" title="Struct template env_var">proto::result_of::env_var</a><span class="special">&lt;</span><span class="identifier">Data</span><span class="special">,</span> <a class="link" href="data_type.html" title="Struct data_type">proto::data_type</a><span class="special">&gt;</span>
      <span class="special">&gt;</span><span class="special">::</span><span class="identifier">type</span>
    <span class="special">&gt;</span><span class="special">::</span><span class="identifier">type</span>
      <span class="special">::</span><span class="keyword">template</span> <span class="identifier">when</span><span class="special">&lt;</span> <span class="identifier">Grammar</span> <span class="special">&gt;</span>
        <span class="special">::</span><span class="keyword">template</span> <span class="identifier">impl</span><span class="special">&lt;</span> <span class="identifier">Expr</span><span class="special">,</span> <span class="identifier">State</span><span class="special">,</span> <span class="identifier">Data</span> <span class="special">&gt;</span>
  <span class="special">{</span>
  <span class="special">}</span><span class="special">;</span>
<span class="special">}</span><span class="special">;</span></pre></div>
<div class="refsect1">
<a name="id-1.3.34.5.54.10.4"></a><h2>Description</h2>
<p>
            Use <code class="computeroutput">proto::when&lt;&gt;</code> to override a grammar's default
            transform with a custom transform. It is for use when composing larger transforms by associating
            smaller transforms with individual rules in your grammar.
          </p>
<p>
            The <code class="computeroutput">when&lt;G, <a class="link" href="external_transform.html" title="Struct external_transform">proto::external_transform</a>&gt;</code>
            indicates that the associated transform is not yet known. It should be looked up when the transform
            is about to be applied. It is found by looking it up in the passed-in Data parameter, which
            behaves like a compile-time map from grammar types to transform types. The map is indexed using
            <code class="computeroutput">Grammar</code> as a key. The associated value type is used as the transform
            to apply. In this way, the same grammar can be used to define multiple evaluating strategies that
            can be added post-hoc.
          </p>
<p>
            See <code class="computeroutput"><a class="link" href="external_transforms.html" title="Struct template external_transforms">proto::external_transforms</a></code> for an example.
          </p>
</div>
</div>
<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
<td align="left"></td>
<td align="right"><div class="copyright-footer">Copyright © 2008 Eric Niebler<p>
        Distributed under the Boost Software License, Version 1.0. (See accompanying
        file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
      </p>
</div></td>
</tr></table>
<hr>
<div class="spirit-nav">
<a accesskey="p" href="when_Gra_1_3_34_5_52_2_1_6/impl.html"><img src="../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../../proto/reference.html#header.boost.proto.transform.when_hpp"><img src="../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="when_Gra_1_3_34_5_52_2_1_7/impl.html"><img src="../../../../doc/src/images/next.png" alt="Next"></a>
</div>
</body>
</html>
